package com.allways.dubbo.mdm.service.questionnaire.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.allways.dubbo.mdm.beans.DataChangeLog;
import com.allways.dubbo.mdm.exception.MdmException;
import com.allways.dubbo.mdm.exception.MdmExceptionCode;
import com.allways.dubbo.mdm.service.BaseDataUtils;
import com.allways.dubbo.mdm.service.log.IDataChangeLogService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;
import com.allways.dubbo.base.dao.MdmBaseDaoImpl;
import com.allways.dubbo.mdm.beans.questionnaire.Questionnaire;
import com.allways.dubbo.mdm.service.questionnaire.IQuestionnaireService;

/**
 * <p>ClassName: IQuestionnaireService</p>
 * <p>Description: 调查问卷Service接口</p>
 * <p>Author: weih</p>
 * <p>Date: 2017-05-23</p>
 */
@Service("mdmQuestionnaireService")
public class QuestionnaireServiceImpl extends MdmBaseDaoImpl implements IQuestionnaireService {
	Log log = LogFactory.getLog(QuestionnaireServiceImpl.class);

    @Autowired
    BaseDataUtils baseDataUtils;
    
     @Autowired
    IDataChangeLogService dataChangeLogService;
    
    @Override
    public int addQuestionnaire(Questionnaire questionnaire) {
   		log.debug("For the new questionnaire parameters:"+ questionnaire.toJson());
   		validColumnLen(questionnaire);
    	
        //无code的不能插入
        if(StringUtils.isEmpty(questionnaire.getQuestionnaireCode())){
            throw new MdmException(MdmExceptionCode.CODE_IS_EMPTY,null);
        }
        //code重复的不允许插入
        if(null != getQuestionnaireByCode(questionnaire.getQuestionnaireCode())){
            throw new MdmException(MdmExceptionCode.CODE_REPEATED,null);
        }
        
        int cnt=insert("questionnaire.insertQuestionnaire",questionnaire);
        
        /*数据变更日志*/
        DataChangeLog datalog = new DataChangeLog();
        datalog.setDataType(DataChangeLog.DataType.questionnaire.getName());
        datalog.setDataPk(questionnaire.getQuestionnaireId().toString());
        datalog.setModifyType(DataChangeLog.OPER_TYPE_ADD);
        dataChangeLogService.addDataChangeLog(datalog);
        
        return cnt;
    }

    @Override
    public int updateQuestionnaire(Questionnaire questionnaire) {
    	log.debug("Update for the questionnaire parameters:"+ questionnaire.toJson());
    	validColumnLen(questionnaire);
     	//无code的不能更新
        if(StringUtils.isEmpty(questionnaire.getQuestionnaireCode())){
            throw new MdmException(MdmExceptionCode.CODE_IS_EMPTY,null);
        }
        //code记录不存在
        Questionnaire oldQuestionnaire = getQuestionnaireByCode(questionnaire.getQuestionnaireCode());
        if(null == oldQuestionnaire){
            throw new MdmException(MdmExceptionCode.UNKNOWNED_RESULT,null);
        }
		oldQuestionnaire.setQnId(questionnaire.getQnId());
		oldQuestionnaire.setQnCode(questionnaire.getQnCode());
		oldQuestionnaire.setQnName(questionnaire.getQnName());
		oldQuestionnaire.setQnDescription(questionnaire.getQnDescription());
		oldQuestionnaire.setValidTime(questionnaire.getValidTime());
		oldQuestionnaire.setTillTime(questionnaire.getTillTime());
		oldQuestionnaire.setIfRelease(questionnaire.getIfRelease());
		oldQuestionnaire.setReleaseTime(questionnaire.getReleaseTime());
		oldQuestionnaire.setDeleteMark(questionnaire.getDeleteMark());
		oldQuestionnaire.setCreateUser(questionnaire.getCreateUser());
		oldQuestionnaire.setCreateTime(questionnaire.getCreateTime());
		oldQuestionnaire.setUpdateUser(questionnaire.getUpdateUser());
		oldQuestionnaire.setUpdateTime(questionnaire.getUpdateTime());
        
        int cnt= update("questionnaire.updateQuestionnaire",oldQuestionnaire);
        /*数据变更日志*/
        DataChangeLog datalog = new DataChangeLog();
        datalog.setDataType(DataChangeLog.DataType.Questionnaire.getName());
        datalog.setDataPk(oldQuestionnaire.getQuestionnaireId().toString());
        datalog.setModifyType(DataChangeLog.OPER_TYPE_EDIT);
        dataChangeLogService.addDataChangeLog(datalog);
        
        return cnt;
    }

    @Override
    public int deleteQuestionnaire(Questionnaire questionnaire) {
    	log.debug("Delete for the questionnaire parameters:"+ questionnaire.toJson());
    	 
        //数据来源不明的不能操作
        if(!baseDataUtils.isDataSourceAvailable(questionnaire.getDataSource())){
            throw new MdmException(MdmExceptionCode.UNKNOWNED_DATASOURCE,null);
        }
     	//无code的不能删除
        if(StringUtils.isEmpty(questionnaire.getQuestionnaireCode())){
            throw new MdmException(MdmExceptionCode.CODE_IS_EMPTY,null);
        }
        Questionnaire fullQuestionnaire = getQuestionnaireByCode(questionnaire.getQuestionnaireCode());
        
        /* 数据变更日志 */
        DataChangeLog datalog = new DataChangeLog();
        datalog.setDataType(DataChangeLog.DataType.Questionnaire.getName());
        datalog.setDataPk(fullQuestionnaire.getQuestionnaireId().toString());
        datalog.setModifyType(DataChangeLog.OPER_TYPE_DELETE);
        dataChangeLogService.addDataChangeLog(datalog);
        
        return delete("questionnaire.deleteQuestionnaire",questionnaire);
    }

    @Override
    public Questionnaire getQuestionnaireByCode(String code) {
    	log.debug("Query for questionnaire code:" + code);
        return queryForObject("questionnaire.getQuestionnaireByCode",code);
    }
    @Override
    public long getQuestionnaireCount(Questionnaire questionnaire) {
    	log.debug("Query for questionnaire count parameters:" + questionnaire.toJson());
        return queryForObject("questionnaire.getQuestionnaireCount",questionnaire);
    }
   @Override
    public List<Questionnaire> queryQuestionnaires(Questionnaire questionnaire, int firstRow, int lastRow) {
      	log.debug("Query for questionnaire parameters:" + questionnaire.toJson()+"\r\n,Page parameters:["+firstRow+","+lastRow+"]");
        if(firstRow<0 || firstRow>lastRow || lastRow<0){
            throw new RuntimeException("Digital is not logical");
        }
        if(lastRow-firstRow > MAX_RETURN_NUM){
            lastRow = firstRow + MAX_RETURN_NUM;
        }
        Map<String ,Object> param = new HashMap<String,Object>();
        param.put("questionnaire",questionnaire);
        param.put("firstRow",firstRow);
        param.put("rowSize",lastRow-firstRow);
        return queryList("questionnaire.queryQuestionnaires", param);
    }
    
    /**
     * 验证字段长度
     * @param questionnaire 需要验证的对象
     */
    private void validColumnLen(Questionnaire questionnaire){
		if(!StringUtils.isEmpty(questionnaire.getQnId()) && questionnaire.getQnId().length()>0){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{0},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getQnCode()) && questionnaire.getQnCode().length()>40){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{40},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getQnName()) && questionnaire.getQnName().length()>20){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{20},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getQnDescription()) && questionnaire.getQnDescription().length()>100){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{100},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getValidTime()) && questionnaire.getValidTime().length()>0){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{0},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getTillTime()) && questionnaire.getTillTime().length()>0){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{0},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getIfRelease()) && questionnaire.getIfRelease().length()>0){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{0},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getReleaseTime()) && questionnaire.getReleaseTime().length()>0){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{0},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getDeleteMark()) && questionnaire.getDeleteMark().length()>0){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{0},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getCreateUser()) && questionnaire.getCreateUser().length()>0){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{0},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getCreateTime()) && questionnaire.getCreateTime().length()>0){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{0},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getUpdateUser()) && questionnaire.getUpdateUser().length()>0){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{0},null);
        }
		if(!StringUtils.isEmpty(questionnaire.getUpdateTime()) && questionnaire.getUpdateTime().length()>0){
            throw new MdmException(MdmExceptionCode.LENGTH_OUT_OF_RANGE,new Object[]{0},null);
        }
        
        //数据来源不明的不能操作
        if(!baseDataUtils.isDataSourceAvailable(questionnaire.getDataSource())){
            throw new MdmException(MdmExceptionCode.UNKNOWNED_DATASOURCE,null);
        }
    }
    
}
